"""文档解析节点 - 处理文档读取和分析的节点函数。"""

import sys
import os
from typing import Dict, Any
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.runnables import RunnableConfig

# 添加项目根目录到 Python 路径
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
src_path = os.path.join(project_root, "src")
if src_path not in sys.path:
    sys.path.insert(0, src_path)

from agents.states import DocumentGraphAnnotation
from tools.document_parser import (
    read_document,
    split_document,
    analyze_document_structure,
)
from utils.models import load_chat_model


def document_reader_node(
    state: DocumentGraphAnnotation, config: RunnableConfig
) -> Dict[str, Any]:
    """文档读取节点 - 读取指定路径的文档。"""
    try:
        messages = state["messages"]  # 修复：使用字典访问方式
        last_message = messages[-1]

        # 从消息中提取文件路径
        file_path = None
        if "file_path" in state and state["file_path"]:
            file_path = state["file_path"]
        else:
            # 尝试从消息内容中提取文件路径
            content = last_message.content
            if "文件路径:" in content:
                file_path = content.split("文件路径:")[1].strip()
            elif "file_path:" in content.lower():
                file_path = content.lower().split("file_path:")[1].strip()

        if not file_path:
            return {
                "messages": messages
                + [AIMessage(content="请提供要读取的文档文件路径。")],
                "document_content": "",
                "document_metadata": {},
                "analysis_result": {},
            }
        
        # 处理文件路径 - 支持相对路径和绝对路径
        if not os.path.isabs(file_path):
            # 如果是相对路径，则相对于项目根目录
            if file_path.startswith("/Data Source/") or file_path.startswith("\\Data Source\\"):
                # 移除开头的路径分隔符
                file_path = file_path.lstrip("/\\")
            elif file_path.startswith("Data Source"):
                # 已经是正确的相对路径格式
                pass
            else:
                # 假设文件在 Data Source 文件夹中
                file_path = os.path.join("Data Source", file_path)
            
            # 构建完整路径
            file_path = os.path.join(project_root, file_path)
        
        # 读取文档
        result = read_document.invoke({"file_path": file_path})

        if "error" in result:
            return {
                "messages": messages
                + [AIMessage(content=f"读取文档失败: {result['error']}")],
                "document_content": "",
                "document_metadata": {},
                "analysis_result": {},
            }

        # 更新状态
        return {
            "messages": messages
            + [AIMessage(content=f"成功读取文档: {os.path.basename(file_path)}")],
            "file_path": file_path,
            "document_content": result["content"],
            "document_metadata": result["metadata"],
            "analysis_result": {},
        }

    except Exception as e:
        messages = state.get("messages", [])
        return {
            "messages": messages
            + [AIMessage(content=f"文档读取节点出错: {str(e)}")],
            "document_content": "",
            "document_metadata": {},
            "analysis_result": {},
        }


def document_analyzer_node(
    state: DocumentGraphAnnotation, config: RunnableConfig
) -> Dict[str, Any]:
    """文档分析节点 - 分析文档内容和结构。"""
    try:
        messages = state["messages"]  # 修复：使用字典访问方式
        content = state["document_content"]  # 修复：使用字典访问方式

        if not content:
            return {
                "messages": messages + [AIMessage(content="没有可分析的文档内容。")],
                "analysis_result": {},
            }

        # 分析文档结构
        structure_result = analyze_document_structure.invoke({"content": content})

        # 分割文档
        chunks = split_document.invoke({"content": content})

        # 使用AI模型进行内容分析
        model = load_chat_model(config)

        analysis_prompt = f"""
        请分析以下文档内容，提供详细的分析报告：
        
        文档结构信息：
        - 总行数: {structure_result.get('total_lines', 0)}
        - 非空行数: {structure_result.get('non_empty_lines', 0)}
        - 潜在标题: {structure_result.get('potential_headings', [])[:5]}
        - 段落数: {len(structure_result.get('paragraphs', []))}
        
        文档摘要: {structure_result.get('summary', '')}
        
        请提供：
        1. 文档主题和类型
        2. 主要内容概述
        3. 关键信息提取
        4. 文档质量评估
        """

        ai_analysis = model.invoke([HumanMessage(content=analysis_prompt)])

        # 组合分析结果
        analysis_result = {
            "structure_analysis": structure_result,
            "content_chunks": chunks,
            "ai_analysis": ai_analysis.content,
            "chunk_count": len(chunks),
        }

        analysis_summary = f"""
        文档分析完成！
        
        📊 结构分析：
        - 总行数: {structure_result.get('total_lines', 0)}
        - 段落数: {len(structure_result.get('paragraphs', []))}
        - 内容块数: {len(chunks)}
        
        🤖 AI分析结果：
        {ai_analysis.content}
        """

        return {
            "messages": messages + [AIMessage(content=analysis_summary)],
            "analysis_result": analysis_result,
        }

    except Exception as e:
        # 修复：确保 messages 在异常处理中可用
        messages = state.get("messages", [])
        return {
            "messages": messages
            + [AIMessage(content=f"文档分析节点执行失败: {str(e)}")],
            "analysis_result": {},
        }
